package com.sanbi.shield.common.bean;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 通用分页
 *
 * @author XiaoQingqing
 * @since 2024/02/26
 * @param <T> 数据类型
 */
@Data
@Accessors(chain = true)
public class CommonPage<T> implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * 页码
     */
    private Long current;
    /**
     * 页大小
     */
    private Long pageSize;
    /**
     * 总条数
     */
    private Long total;
    /**
     * 数据
     */
    private List<T> records;

    /**
     * 元素转换
     *
     * @param mapper 映射器
     * @return 转换结果
     * @param <R> 结果元素类型
     */
    public <R> CommonPage<R> convert(Function<T,R> mapper){
        CommonPage<R> page = new CommonPage<>();
        page.setCurrent(current).setPageSize(pageSize).setTotal(total);
        if(null == records || records.isEmpty()){
            return page.setRecords(new ArrayList<>());
        }
        return page.setRecords(records.stream().map(mapper).collect(Collectors.toList()));
    }

    /**
     * 构造通用分页
     *
     * @param current  页码
     * @param pageSize 页大小
     * @param total    总条数
     * @param records  列表数据
     * @return 通用分页
     * @param <T> 数据类型
     */
    public static <T> CommonPage<T> of(Long current, Long pageSize, Long total, List<T> records){
        CommonPage<T> page = new CommonPage<>();
        return page.setCurrent(current).setPageSize(pageSize).setTotal(total).setRecords(records);
    }

    /**
     * 构造空的通用分页
     *
     * @param current  页码
     * @param pageSize 页大小
     * @param total    总条数
     * @return 通用分页
     * @param <T> 数据类型
     */
    public static <T> CommonPage<T> emptyPage(Long current, Long pageSize, Long total){
        return of(current, pageSize, total, new ArrayList<>());
    }
}
